package com.fxu.framework.core.sql;

import com.fxu.framework.core.util.FieldUtil;

import java.io.Serializable;
import java.util.List;

/**
 * 查询条件接口
 *
 * @author fangxu
 * @version 1.0.0
 */
interface SOrder<Chain extends SOrder<?, ?>, SE extends SEntity<?>> extends Serializable {
    /**
     * 实体类的类
     * @return 实体类
     */
    Class<SE> getClazz();

    /**
     * 实体类的类
     * @return 排序字段集合
     */
    List<SValue> getOrderByFields();

    /**
     * 设置正序排列字段
     * @param field 正序排序字段
     * @return 本类对象
     */
    default Chain orderAsc(SField<?> field) {
        getOrderByFields().add(new SValue(SType.ORDER_BY_ASC, field, null));
        return (Chain) this;
    }

    /**
     * 设置倒序排列字段
     * @param field 正序排序字段
     * @return 本类对象
     */
    default Chain orderDesc(SField<?> field) {
        getOrderByFields().add(new SValue(SType.ORDER_BY_DESC, field, null));
        return (Chain) this;
    }

    /**
     * 设置正序排列字段
     * @param field 正序排序字段
     * @return 本类对象
     */
    default Chain orderAsc(SFunc<SE, ?> field) {
        return orderBy(field, true);
    }

    /**
     * 设置倒叙排序字段
     * @param field 倒叙排序字段
     * @return 本类对象
     */
    default Chain orderDesc(SFunc<SE, ?> field) {
        return orderBy(field, false);
    }

    /**
     * 设置排序字段
     * @param field 排序字段
     * @param asc 是否正序
     * @return 本类对象
     */
    default Chain orderBy(SFunc<SE, ?> field, boolean asc) {
        if (field != null) {
            SType sType = asc ? SType.ORDER_BY_ASC : SType.ORDER_BY_DESC;
            getOrderByFields().add(new SValue(sType, new SField<>(getClazz(), field), null));
        }
        return (Chain) this;
    }

    default Chain orderById(boolean asc) {
        SType sType = asc ? SType.ORDER_BY_ASC : SType.ORDER_BY_DESC;
        getOrderByFields().add(new SValue(sType, new SField<>(FieldUtil.getPriKeyField(getClazz())), null));
        return (Chain) this;
    }

}